<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 队列函数:先进先出
        function Queue(){
            this.arr = []

            // 1、将元素加入到队列中
            Queue.prototype.enqueue = (item)=>{
                return this.arr.push(item)
            }

            // 2、从队列中删除前端元素
            Queue.prototype.dequeue = () =>{
                return this.arr.shift()
            }

            // 3、查看前端的元素
            Queue.prototype.front = ()=>{
                return this.arr[0]
            }

            // 4、查看队列是否为空
            Queue.prototype.isEmpty = ()=>{
                return this.arr.length === 0
            }

            // 6、查看队列中个数
            Queue.prototype.size = () =>{
                return this.arr.length
            } 

            // toString
            Queue.prototype.toString = () =>{
                let result = ''
                this.arr.forEach(item =>{
                    result += item + ' '
                })
                return result
            }
        }

        // const queue = new Queue()
        // queue.enqueue(...[1,2,3])
        // queue.enqueue(2)
        // queue.enqueue(3)
        // alert(queue.toString())
        // queue.dequeue()
        // alert(queue.toString())
        // alert(queue.front())
        // alert(queue.isEmpty())
        // alert(queue.size())

        // 应用：击鼓传花: 参数一参加的人的数组，参数二为鼓声数
        // 解释: 从数组0开始数:1.2.3.4....，数到的数为鼓声数一致的元素删除，并从该元素起(不包括该元素)重新重一开始数
        function queueFn( personNun, drumNum){
            const queue = new Queue()
            personNun.forEach(item =>{
                queue.enqueue(item)
            })
            //1、队列中人数为1时游戏结束
            while(queue.size()   > 1 ){
                // 循环 鼓声数-1次，并将其逐个从队列中执行删除和添加-->这是一个周期
                for (let index = 0; index < drumNum-1; index++) {
                    //将队列头删除
                    let item = queue.dequeue()
                    //并将该队列头添加到队列尾
                    queue.enqueue(item)
                }
                // 循环结束后，队列头就是数的数和鼓声数一致的，从队列中完全删除
                queue.dequeue()
            }
            console.log(queue.front())
            // 队列中只剩下一个即为获胜者，将其从原数组中对比，即可知道他原先的下标
            return personNun.findIndex( item => item == queue.front())
        }

        let arr = ['a','b','c','d','e']
        console.log(queueFn(arr,4))


        // 优先级队列,数值越小优先级越大
        function PriorityQueue(){
            this.arr =[]
            // 优先级插入
            PriorityQueue.prototype.enqueue = (obj,num)=>{
                // 将传入的值和优先级值封装成对象
                const element = {obj,priority:num}

                // 只有一个直接插入
                if (this.arr.length === 0){
                    this.arr.push(element)
                }else{
                    // 循环数组, 判断优先级
                    for (let index = 0; index < this.arr.length; index++) {
                        // 找到比插入的优先级大的，将插入的对象插入到当前索引的左边,并结束循环
                        if (this.arr[index].priority > num){
                            console.log('有了')
                            this.arr.splice(index,0,element)
                            return
                        }
                    }
                    // 到这表示优先级的数值是最大的，放到数组最后
                    this.arr.push(element)
                }

            }
        }

        const pp = new PriorityQueue()
        pp.enqueue("叶",1)
        pp.enqueue("张",10)
        pp.enqueue("王",3)
        pp.enqueue("王",5)
        pp.enqueue("王",553)
        console.log(pp)
    </script>   
</body>
</html>